在探索 MongoDB 性能監控的過程中,我爬了一堆文章,最後總結一系列我認為很重要的關鍵指標,本文將藉著實務經驗分享我們該如何使用各項查詢指令,並分析這些關鍵指標代表什麼意義,幫助我們了解系統運行狀況,及早發現潛在問題並及時採取優化措施。
透過 db.rawdata.stats() 檢視集合的基本資訊:
{
    count: 3109528,                // 文件總數
    size: 22859420160,            // 原始數據大小(約 21.3 GB)
    avgObjSize: 7351,             // 平均每筆文件大小(約 7.2 KB)
    storageSize: 3371008000,      // 實際存儲大小(約 3.14 GB)
    totalIndexSize: 63892480,     // 索引總大小(約 61 MB)
    nindexes: 2                   // 索引數量
}
通過 db.serverStatus().mem 檢視系統記憶體使用情況:
{
    bits: 64,
    resident: 5813,      // 實際使用的實體記憶體(約 5.8 GB)
    virtual: 6266,       // 虛擬記憶體使用量(約 6.3 GB)
    supported: true
}
通過 db.serverStatus().wiredTiger 檢視存儲引擎效能指標:
cache: {
    'maximum bytes configured': 8589934592,    // 配置的最大快取大小(8 GB)
    'bytes currently in the cache': 6442450944,// 當前使用的快取(6 GB)
    'pages requested from the cache': 11958296,// 快取頁面請求總數
    'pages read into cache': 203920,          // 從磁碟讀入的頁面數
    'pages written from cache': 423890,       // 寫入磁碟的頁面數
    'modified pages evicted': 156789,         // 被逐出的已修改頁面數
    'unmodified pages evicted': 234567        // 被逐出的未修改頁面數
}
connection: {
    'total read I/Os': 3109528,    // 總讀取操作次數(與文件數相當)
    'total write I/Os': 89756,     // 總寫入操作次數
    'total fsync I/Os': 15678,     // 檔案同步操作次數
    'total read time (usecs)': 892345,
    'total write time (usecs)': 234567
}
cursor: {
    'cursor create calls': 3893410,    // 游標創建次數(約為文件數的 1.25 倍)
    'cursor next calls': 15547640,     // 游標遍歷次數(約為文件數的 5 倍)
    'cursor search calls': 3109528,    // 精確查詢次數(與文件數相當)
    'cursor search near calls': 1554764 // 範圍查詢次數(約為文件數的 0.5 倍)
}
transaction: {
    'transaction begins': 567890,
    'transaction commits': 456789,
    'transaction rollbacks': 12345,
    'transactions rolled back by conflict': 234
}
好的,明明是因為系統曾經出現 oom-kill (記憶體使用達上限導致服務強制中斷),才開啟我的優化之路的,結果現在卻是機制良好、運作順暢?!
其實是因為我寫這篇文章時,並不是用量尖峰時期,那要怎麼觀察用量尖峰的狀態呢?
下一篇我會寫如何實作 MongoDB 簡易的監控方式,幫助我們捕捉到尖峰時的崩潰是怎麼發生的,進而採取下一步調整,敬請期待!